spring boot jpa 开发实战记录
该文章为 spring boot jpa 项目开发实战记录,在项目开发中记录着需要注意和复用的地方,方便 jpa 使用者复用,提高开发效率。
一、jpa 动态查询 + 排序 + 分页(非注解)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| @Override public Page<TsDbMeta> getTsDbInfo(String name, Boolean createInstance, String description, PageRes<TsDbMeta> pageRes) {
Sort sort = Sort.by(Sort.Direction.DESC, "createTime"); Pageable pageable = PageRequest.of(pageRes.getPageNum() - 1, pageRes.getPageSize(), sort);
return tsDbMetaRepository.findAll((root, query, criteriaBuilder) -> { List<Predicate> list = new ArrayList<>();
if (StrUtil.isNotBlank(name)) { list.add(criteriaBuilder.equal(root.<String>get("name"), name)); } if (createInstance != null) { list.add(criteriaBuilder.equal(root.<String>get("createInstance"), createInstance)); } if (StrUtil.isNotBlank(description)) { list.add(criteriaBuilder.like(root.<String>get("description"), "%" + description + "%")); } Predicate[] p = new Predicate[list.size()]; return criteriaBuilder.and(list.toArray(p));
}, pageable); }
|
二、jpa 其它问题
1、设置 Date 类型自动转 13 位时间戳
1 2 3 4
| spring: jackson: serialization: write-dates-as-timestamps: true
|
2、如果想让返回的数据时间字段为 yyyy-MM-dd 格式
可以在对应实体类中添加注解:
1
| @JsonFormat(timezone="GMT+8", pattern="yyyy-MM-dd")
|
3、jpa 自动更新实体创建时间和修改时间
1)实体类中
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate;
@CreatedDate private Date createTime;
@LastModifiedDate private Date modifyTime;
|
1 2 3 4 5 6
| import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@EntityListeners(AuditingEntityListener.class) public class AccessClientid { ... }
|
1 2 3
| import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@EnableJpaAuditing
|
4、设置 jpa sql 语句显示查询参数值
1 2 3 4
| logging: level: org.hibernate.type.descriptor.sql.BasicBinder: trace
|
5、在控制台格式化输出 sql 语句
1 2 3 4 5 6
| spring: jpa: properties: hibernate: show_sql: true format_sql: true
|
6、JPA 复合主键使用
1)表结构:
1 2 3 4 5 6 7
| CREATE TABLE `gateway_points_day_count` ( `stat_time` date NOT NULL COMMENT '日期,格式YYYY-MM-DD', `tenant_id` varchar(30) NOT NULL, `namespace` varchar(100) NOT NULL, `num_points` int(11) DEFAULT 0, PRIMARY KEY (`stat_time`,`tenant_id`,`namespace`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
有一个三个字段的复合主键。
2)JPA 实体类
在实体类上添加注解:@IdClass(GatewayPointsDayCountIds.class),然后作为主键的字段上添加注解:@Id。如下图所示:
创建 GatewayPointsDayCountIds 类,该类的属性都是上个实体类里面的主键字段。如下图所示:
三、多表联合查询
待补充。
再见
好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。
白嫖不好,创作不易。各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
如果本篇博客有任何错误,请批评指教,不胜感激 !